热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

都市渲染流程解析:首个执行的Pass_1与不同LightMode的选择顺序分析

本文由编程笔记#小编为大家整理,主要介绍了_第一个被执行的Pass_1_不同LightMode 被选择的顺序相关的知识,希望对你有一定的参考价值。 第5章 第一个被执行的Pass 5.1 不同Ligh
本文由编程笔记#小编为大家整理,主要介绍了_第一个被执行的Pass_1_不同LightMode 被选择的顺序相关的知识,希望对你有一定的参考价值。



第5章 第一个被执行的Pass
5.1 不同LightMode 被选择的顺序
5.1.1 渲染路径和Pass的LightMode标签



    Unity支持3种RenderingPath,分别是VertexLit, ForwardDeferred Lighting,为此又定义
了在Pass中使用的LightMode标签Vertex, ForwardBase, ForwardAdd, PrepassBase, PrepassFinal
等,分别表示当前Pass是为在哪一个RenderingPath下设计使用的。


5.1.2设计可以检测渲染路径的材质


    现在的问题就是,在Shader中存在多个适应不同渲染路径的Pass时,Unity会怎么做?是按
照某种次序全部渲染?还是只是挑选出其中一个最优的Pass在对应的渲染路径下渲染?


    首先是Deferred.shader,这是一个被设计为只会在Camera的RenderingPath为Deferred模式
下输出红色的Shader,其代码如下:


Shader "Tut/Lighting/FirstLight/Lab_1/Deferred"
Properties
_MainTex ("Base (RGB)", 2D) = "white"

SubShader
Tags "RenderType"="Opaque"
Blend One One
CGPROGRAM
#pragma surface surf MyDeferred
half4 LightingMyDeferred_PrePass (SurfaceOutput s, half4 light)
half4 c;
c.rgb = s.Albedo;
c.a = s.Alpha;
return c;

struct Input
float2 uv_MainTex;
;
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o)
o.Albedo=float3(1,0,0);

ENDCG


再就是Deferred_Forward.shader,这是一个包含可以适应Deferred以及Forward渲染路径的材
质,其中适应Deferred的部分输出(1 ,0, 0, 1)的红色,而适应Forward的部分只会输出的(0,
1, 0,  1)绿色;两个部分都使用了Blend One One混合模式,也就是说如果两部分都执行的话,
应该会输出(1,  1,  0,  1)的黄色,反之则只会输出被执行的那一个的输出颜色,也就是红色或
者绿色。其代码如下:






Shader "Tut/Lighting/FirstLight/Lab_1/Deferred_Forward"
SubShader
Blend One One
//.1
pass
Tags "LightMode"="ForwardBase"
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct vertOut
float4 pos:SV_POSITION;
float4 color:COLOR;
;
vertOut vert(appdata_base v)

vertOut o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.color=float4(0,1,0,1);
return o;

float4 frag(vertOut i):COLOR

return i.color;

ENDCG
//end pass
//.2
CGPROGRAM
#pragma surface surf MyDeferred
half4 LightingMyDeferred_PrePass (SurfaceOutput s, half4 light)
half4 c;
c.rgb = s.Albedo;
c.a = s.Alpha;
return c;

struct Input
float2 uv_MainTex;
;
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o)
o.Albedo=float3(1,0,0);

ENDCG


    然后是Deferred_Forward_Vertex.shader,这个Shader和上面的Deferred_Forward.shader类似,
不同的是添加了可以适应VertexLit渲染路径的Pass,会输出蓝色。也就是说,如果3个都执行,
则会输出白色(1,1,1,1),否则会输出红、绿、蓝3个颜色的一个或两个的组合。其代码如一下:


Shader "Tut/Lighting/FirstLight/Lab_1/Deferred_Forward_Vertex"
SubShader
Blend One One
//.1
pass
Tags "LightMode"="Vertex"
Blend One Zero
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct vertOut
float4 pos:SV_POSITION;
float4 color:COLOR;
;
vertOut vert(appdata_base v)

vertOut o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.color=float4(0,0,1,1);
return o;

float4 frag(vertOut i):COLOR

return i.color;

ENDCG
//end pass
//.2
pass
Tags "LightMode"="ForwardBase"
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct vertOut
float4 pos:SV_POSITION;
float4 color:COLOR;
;
vertOut vert(appdata_base v)

vertOut o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.color=float4(0,1,0,1);
return o;

float4 frag(vertOut i):COLOR

return i.color;

ENDCG
//end pass
//.3
CGPROGRAM
#pragma surface surf MyDeferred
half4 LightingMyDeferred_PrePass (SurfaceOutput s, half4 light)
half4 c;
c.rgb = s.Albedo;
c.a = s.Alpha;
return c;

struct Input
float2 uv_MainTex;
;
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o)
o.Albedo=float3(1,0,0);

ENDCG


    最后还有Deferred_Vertex.shader,这是一个含有可以适应Deferred和VertexLit模式的材质。
和Deferred_Forward_Vertex.shader类似,只不过去掉了适应Forward渲染路径的部分。还有
Forwardes_Vertex.shader,这个Shader去掉了适应Deferred模式的部分,还有单独适应Forward渲
染路径的Forward.shader,以及单独适应VertexLit渲染路径的Vertex.shader。其具体实现都很简单,
但是所有针对Deferred渲染路径的Pass最终都会输出红色(1,  0,  0,  1),所有针对Forward渲
染路径的Pass最终都会输出绿色(0, 1, 1, 1),所有针对VertexLit渲染路径的Pass最终都会输
出蓝色(0,  0,  1,  1)。


5.1.3设计便于检测渲染路径的场景


    在具体的场景中布置丰富的光源,可以保证任何一个RenderingPath都可以得到想要的光照,
将场景的主相机背景色设置为黑色,背景就不会对材质的Blend One One操作造成任何影响,绿
色的控制面板上的一系列按钮可以帮我们切换灯光的类型,以及Camera的RenderingPath。现在
我们可以根据不同渲染路径下颜色的输出判断不同的渲染路径下哪些Pass被执行,哪些没有。编
译并执行此场景。


5.1.4 VertexLit渲染路径下Pass的执行

    首先切换Camera到VertexLit模式下,如图所示。可以看到只有含LightMode = Vertex的Pass会被执行,并输出蓝色,其他的都没有被执行。



5.1.5 Forward渲染路径下Pass的执行

    切换相机到Forward渲染路径,可以看到如图所示的结果。凡是包含了针对Forward渲染路径的Pass都会被执行,并输出相应的绿色。如果没有包含针对Forward渲染路径的Pass,但是包含了针对VertexLit渲染路径的Pass,则也会被执行,并输出相应的蓝色。但是如果有Forward渲染路径的Pass可执行,就不会执行VertexLit渲染路径的Pass。针对Deferred渲染路径的Pass不会被执行。



5.1.6  Deferred渲染路径下Pass的执行

    再切换相机到Deferred渲染路径下,可以看到如图所示的结果。所有材质,凡是包含了针对Deferred的Pass可执行,则执行Deferred的Pass,并输出红色,其他Pass不会被执行。如果不包含针对Deferred的Pass,而且材质包含了Forward的Pass,则执行针对Forward设计的Pass输出相应的绿色。如果材质既没有针对Deferred的Pass,也没有针对Forward的Pass,则会执行Vertex的Pass,并输出蓝色。



5.1.7不同渲染路径下的Pass执行规则总结


    我们可以总结出,Unity在Deferred渲染路径下,则会寻找可在Deferred渲染模式下的Pass
然后返回,并不会执行其他渲染路径下的Pass,但是如果找不到Deferred状态下的Pass,则会再寻找Forward模式下的Pass并执行,然后返回,如果Forward模式下的Pass依然没有找到,则会寻找VertexLit模式下的Pass并执行。在Forward渲染路径下,会优先寻找Forward模式下可渲染的Pass,如果找不到,才会寻找 VertexLit模式下可渲染的Pass。


      但是无论如何,Unity在一个时间只会执行一个渲染路径下的Pass,它并不会将全部可执行
Pass都渲染
推荐阅读
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
  • 在晴朗天气条件下,对一种神奇的魔法现象进行了深入分析。该题目为原创,基准时间限制为1秒,空间限制为131072KB,分值20,属于3级难度的算法题。研究发现,这种魔法现象在阳光明媚的环境中表现得尤为显著,进一步探讨了其背后的科学原理和技术实现方法。 ... [详细]
  • 在解决区间相关问题时,我发现自己经常缺乏有效的思维方式,即使是简单的题目也常常需要很长时间才能找到解题思路,而一旦得到提示便能迅速理解。题目要求对一个包含n个元素的数组进行操作,并给出一个参数k,具体任务是…… ... [详细]
  • 探索偶数次幂二项式系数的求和方法及其数学意义 ... [详细]
  • 利用Python进行学生学业表现评估与成绩预测分析
    利用Python进行学生学业表现评估与成绩预测分析 ... [详细]
  • 哈希表(Hash Table)是一种高效的查找算法,与传统的链表和树结构相比,其在查找过程中无需进行逐个元素的比较。本文将深入探讨哈希表的基本原理、应用场景以及优化策略,帮助读者全面理解其在实际开发中的优势和局限性。通过实例分析和代码示例,我们将展示如何有效利用哈希表提高数据处理效率,并解决常见的冲突问题。 ... [详细]
  • 题目链接:http://codeforces.com/gym/101190/attachments题意:在一个共享三轮车站点,某些用户需要租用车辆。该问题涉及如何通过离线查询和排序优化策略来高效地管理和分配车辆资源。具体来说,需要设计一种算法,在满足所有用户需求的同时,最小化总等待时间和资源浪费。通过合理的数据结构和算法优化,可以显著提高系统的整体性能和用户体验。 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • HDU1176:免费馅饼问题的动态规划解法分析
    题目“免费馅饼”通过动态规划方法进行了解析。该问题的时间限制为 Java 2000ms 和其他语言 1000ms,内存限制为 Java 65536K 和其他语言 32768K。本文详细探讨了如何利用动态规划算法高效求解此问题,并对算法的时间复杂度和空间复杂度进行了深入分析。此外,还提供了具体的实现步骤和代码示例,帮助读者更好地理解和应用这一方法。 ... [详细]
  • 本文详细解析了九度编程平台上的斐波那契数列高效算法挑战(题目编号:1387)。该挑战要求在1秒的时间限制和32兆的内存限制下,设计出高效的斐波那契数列计算方法。通过多种算法的对比和性能分析,本文提供了优化方案,帮助参赛者在限定资源条件下实现高效计算。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 求助高手调试程序,非常感谢您的支持!在编写C语言程序时遇到了一些问题,具体代码如下:```c#include #include #include #define MAX 50int t;```希望有经验的开发者能提供指导,帮助解决调试中的难题。感谢您的时间和帮助! ... [详细]
  • 本文深入探讨了使用Puppet进行软件包分发与管理的方法。首先介绍了fpm这一跨平台的软件包制作工具,其简便的操作流程使得软件包的创建变得轻松快捷。fpm的项目地址为:https://github.com/jordansissel/fpm。通过结合Puppet和fpm,可以实现高效、可靠的软件包管理和部署。 ... [详细]
  • [BZOJ1047] [HAOI2007] 单调队列在理想正方形问题中的应用与优化
    本文探讨了在解决理想正方形问题时,如何利用单调队列进行高效优化。具体而言,给定一个由整数组成的 \(a \times b\) 矩阵,目标是从中找到一个 \(n \times n\) 的子矩阵,使该子矩阵内所有元素的最大值与最小值之差最小。输入部分首先提供三个整数,分别表示矩阵的行数、列数以及子矩阵的边长。通过引入单调队列,算法能够显著提高搜索效率,从而快速找到最优解。 ... [详细]
author-avatar
涩味122_508
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有